/*
IO extend with 74hc595
注意：要将黄色跳线帽J24短接到GND一端
*/
#include"reg52.h"

typedef unsigned char u8;//重定义数据类型
typedef unsigned int u16;

//定义控制脚
sbit SRCLK=P3^6;//移位寄存器时钟输入
/*Shift Register Clock Input. A low– to–high transition onthis 
input causes the data at the Serial Input pin to be shiftedinto 
the 8–bit shift register.
*/
sbit zRCLK=P3^5;//存储寄存器时钟输入
/*
Storage Latch Clock Input. 
A low–to–high transition onthis input latches
the shift register data.
*/
sbit SER=P3^4;//串行数据输入

//宏定义阵列控制端口
#define LEDDZ_COL_PORT P0

u8 ghc595_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//要输入的数据的缓冲区

/*
延时函数
*/
void delay_10us(u16 time)
{
	while(time)
	{
		time--;
	}
}
/*
延时函数2
*/
void delay_ms(u16 ms)
{
	u16 i,j;
	for(i=ms;i>0;i--)
	{
		for(j=110;j>0;j--);
	}
}
/*
写数据
向hc595写入一个字节数据
*/

void hc595_write_data(u8 dat)
{
	u8 i=0;
	for(i=0;i<8;i++)
	{
		SER=dat>>7;//优先传输一个字节中的高位
		dat<<=1;//将低位移动到高位
		SRCLK=0;
		delay_10us(1);
		SRCLK=1;
		delay_10us(1);//上升沿将端口数据写入寄存器
	}
	zRCLK=0;
	delay_10us(1);
	zRCLK=1;
	//上升沿将寄存器数据输出
}

void main()
{
	u8 i=0;
	LEDDZ_COL_PORT=0x00;//设置LED阴极为低电平
	while(1)
	{
		for(i=0;i<8;i++)
		{
			hc595_write_data(0x00);//消除前面寄存器缓存数据
			hc595_write_data(ghc595_buf[i]);//写入新数据
			delay_ms(500);//延时500ms
		}
	}
}